package com.yupi.yuaicodemother.ai.model;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
public class ModuleService {

    private final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 解析 AI 返回的信息并提取模块信息
     *
     * @param aiResponse AI 返回的信息
     * @return 模块信息
     * @throws IOException 如果解析 JSON 数据时发生错误
     */
    public ModuleInfo parseModuleInfo(String aiResponse) throws IOException {
        // 将字符串转换为 JSON 格式
        JsonNode rootNode = convertStringToJson(aiResponse);

        // 提取模块数量
        int totalModules = rootNode.path("totalModules").asInt();

        // 提取模块信息
        List<ModuleInfo.Module> modules = new ArrayList<>();
        JsonNode modulesNode = rootNode.path("modules");
        if (modulesNode.isArray()) {
            for (JsonNode moduleNode : modulesNode) {
                String moduleId = moduleNode.path("moduleId").asText();
                String moduleName = moduleNode.path("moduleName").asText();
                modules.add(new ModuleInfo.Module(moduleId, moduleName));
            }
        }

        // 创建返回结果
        ModuleInfo result = new ModuleInfo();
        result.setMessageInfo(rootNode.path("messageInfo").asText());
        result.setTotalModules(totalModules);
        result.setModules(modules);

        return result;
    }

    /**
     * 将字符串转换为 JSON 格式
     *
     * @param input 输入的字符串
     * @return 转换后的 JSON 节点
     * @throws IOException 如果转换失败
     */
    private JsonNode convertStringToJson(String input) throws IOException {
        try {
            // 尝试直接解析为 JSON
            return objectMapper.readTree(input);
        } catch (IOException e) {
            // 如果解析失败，则尝试将其包装为一个 JSON 对象
            ObjectNode objectNode = objectMapper.createObjectNode();
            objectNode.put("content", input);
            return objectNode;
        }
    }
}